import UIKit

/* XCode15的Swift版本5.9 */

/* Hello World */
var myString = "Hello, World!"
print(myString)

/* Swift 编写规范 */
// 1.加不加分号都是可以的

// 2.对空格有一定的要求
// 以下的写法时错误的
// let a= 1+2
// let a = 1+ 2
// 保持优美的空格风格就是最好的
let a = 1 + 2

/* 控制台输入输出 */
print("test")

// 字符串中引入变量的方法
// terminator用于修改结束的标志，默认是换行符
for x in 0...10 {
    print("\(x) ", terminator: "")
}

/* Xcode 的 Playground提供了查看循环变量的图形的方法*/
var value = 2
while value < 10000 {
    value *= 2
}

/* 类型别名 */
typealias Integer = Int

var distance: Int = 100
var distance_2: Integer = 200

/* 类型自动判断 */
// varA 会被推测为 Int 类型
var varA = 42
print(varA)

// varB 会被推测为 Double 类型
var varB = 3.14159
print(varB)

// varC 也会被推测为 Double 类型
var varC = 3 + 0.14159
print(varC)

/* 变量，使用var进行声明 */

// 可选类型
// 表示类型为nil或者给定的格式，用来表示可能有或可能没有值
// 任何类型都可以明确声明为或者隐式转换可选类型
// 没有提供初始值时默认为nil

// 两种定义方式
// 使用符号
var optionalInteger: Int?
// 使用泛型
var optionalInteger_2: Optional<Int>

// 赋值和正常的赋值是一样的
optionalInteger = 42
// 通过!可以进行强制解析
optionalInteger!

var myString_2: String?
var myString_3: String? = "Valid value"

// 不解析的话将得到这个可选变量的完整信息
// 并且会显示警告信息
print(myString_2)
print(myString_3)

// 强制解析要规范进行
// 直接对nil解析会报错误
// print(myString_2!)

// 想要强制解析获取其中的值的时候应有所判断
if myString_2 != nil {
    print(myString_2!)
}else{
    print("myString_2 is nil")
}

if myString_3 != nil {
    print(myString_3!)
}else{
    print("myString_3 is nil")
}

// 或者采用可选绑定的方法
if let bindString = myString_2 {
    print("myString_2: \(bindString)")
}else{
    print("myString_2 is nil")
}

if let bindString = myString_3 {
    print("myString_3: \(bindString)")
}else{
    print("myString_3 is nil")
}

// 在类型后面加上!，表示自动解析的可选型
var myString_4: String! = "auto"
// 不解析直接将可选性赋值给非可选型的变量将报错
// var unwrapString: String = myString_3
var wrapedString: String = myString_4

/* 常量：使用let声明 */
let _const: String = "Hello, Swift"
print(_const)

/* 自变量书写规范 */
let decimalInteger = 17           // 17 - 十进制表示
let binaryInteger = 0b10001       // 17 - 二进制表示
let octalInteger = 0o21           // 17 - 八进制表示
let hexadecimalInteger = 0x11     // 17 - 十六进制表示

let decimalDouble = 12.1875       //十进制浮点型字面量

// 指数部分由大写或小写字母e为前缀后跟**十进制**数字串组成
// 这串数字表示e之前的数量乘以10的几次方
let exponentDouble = 1.21875e1    //十进制浮点型字面量
// 指数部分由大写或小写字母p为前缀后跟**十进制**数字串组成，
// 这串数字表示p之前的数量乘以**2**的几次方
let hexadecimalDouble = 0xC.3p0   //十六进制浮点型字面量

// 字符串自变量以及转义字符同C语言

// Swift中用nil表示没有值
